package com.foo.designpattern.factory.factorymethod;

import junit.framework.TestCase;

/**
 * com.foo.designpattern.factory.factorymethod
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-09 16:18.
 *
 * @Description 测试类：工厂方法模式
 * 工厂方法模式组成：
 * 1、抽象工厂角色；接口 BMWFactory
 * 2、具体工厂角色：类 BMW320Factory、类 BMW523Factory
 * 3、抽象产品角色：接口 BMW
 * 4、具体产品角色：类 BMW320、类 BMW523
 * <p/>
 * 工厂方法模式使用继承自抽象工厂角色的多个子类来代替静态工厂模式中的工厂类。
 * 这样，分担了对象承受的压力，而且这样使得结构变得灵活起来：
 * 当有新的产品产生时，只要按照抽象产品角色、抽象工厂角色提供的合同来生成，
 * 那么就可以被客户使用，而不必去修改任何已有的代码。
 * 由此看出，工厂角色的结构是符合开闭原则的。
 * <p/>
 * 工厂方法模式貌似已经很完美的对对象的创建进行了包装，使得客户程序中仅仅处理抽象产品角色提供的接口，但使得对象的数量成倍增长。
 * 当产品种类非常多时，会出现大量的与之对应的工厂对象，这不是我们想看到的。
 */

public class FactoryMethodTestCase extends TestCase {
    public void testFactoryMethod() {
        System.out.println("= = = = ↓↓↓工厂方法模式，测试开始↓↓↓ = = = =");

        BMWFactory bmw320Factory = new BMW320Factory();
        BMW bmw320 = bmw320Factory.createBMW();
        bmw320.run();

        BMWFactory bmw523Factory = new BMW523Factory();
        BMW bmw523 = bmw523Factory.createBMW();
        bmw523.run();

        System.out.println("= = = = ↑↑↑工厂方法模式，测试结束↑↑↑ = = = =");
    }
}
